﻿// Building a Space Station POJ - 2031.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

/*
https://vjudge.net/problem/POJ-2031
你是空间站工程小组的成员，在空间站的建造过程中被分配了一项任务。
你需要编写一个计算机程序来完成这项任务。
空间站由许多单元组成，称为单元。所有单元都是球形的，但它们的大小不一定一致。
空间站成功进入轨道后不久，每个单元就被固定在预定位置上。非常奇怪的是，两个单元可能相互接触，甚至可能重叠。
在极端情况下，一个小室可能完全包围着另一个小室。我不知道这样的排列是怎么可能的。


所有牢房必须是相连的，因为机组人员应该能够从任何一个牢房走到任何其他牢房。
他们可以从一个单元 A 走到另一个单元 B，条件是：(1) A 和 B 相互接触或重叠；(2) A 和 B 之间有 "走廊 "连接；
或 (3) 有一个单元 C，可以从 A 走到 C，也可以从 B 走到 C。请注意，条件（3）应作转换解释。


您需要设计一种配置，即用走廊连接哪几对单元。走廊配置有一定的自由度。
例如，如果有三个单元 A、B 和 C，彼此不接触也不重叠，那么至少有三种方案可以将这三个单元连接起来。
第一种是修建 A-B 和 A-C，第二种是 B-C 和 B-A，第三种是 C-A 和 C-B。建造走廊的成本与长度成正比。因此，应选择走廊总长度最短的方案。


您可以忽略走廊的宽度。走廊建在两个单元表面的点之间。走廊的长度可以任意选择，但当然要选择最短的一条。
即使两条走廊 A-B 和 C-D 在空间上相交，它们也不会被视为（例如）A 和 C 之间的连接路径。
输入
输入由多个数据集组成。每个数据集的格式如下


n
x1 y1 z1 r1
x2 y2 z2 r2
...
xn yn zn rn


数据集的第一行包含一个整数 n，即单元格数。


下面的 n 行是对单元格的描述。一行中的四个值依次是球心的 x 坐标、y 坐标和 z 坐标以及半径（在问题的其他部分称为 r）。
每个数值都用小数点后 3 位数字表示。数值之间用空格隔开。


x、y、z 和 r 均为正值，且小于 100.0。


输入结束时，一行中包含一个零。
输出
对于每个数据集，应打印出走廊的最短总长度，每个长度单独一行。打印值的小数点后应有 3 位数字。误差不得大于 0.001。


请注意，如果不需要走廊，即所有单元格都连接在一起而没有走廊，则走廊的最短总长度为 0.000。

3
10.000 10.000 50.000 10.000
40.000 10.000 50.000 10.000
40.000 40.000 50.000 10.000
2
30.000 30.000 30.000 20.000
40.000 40.000 40.000 20.000
5
5.729 15.143 3.996 25.837
6.013 14.372 4.818 10.671
80.115 63.292 84.477 15.120
64.095 80.924 70.029 14.881
39.472 85.116 71.369 5.553
0

20.000
0.000
73.834


*/
int main()
{
    std::cout << "Hello World!\n";
}
 